package util;

import java.io.*;

public class ObjectCloner {

    /**
     * 克隆指定对象的方法
     * 
     * @param <T>   对象类型
     * @param obj   需要克隆的对象
     * @return      克隆后的对象
     * @throws IOException              如果在序列化过程中发生IO错误
     * @throws ClassNotFoundException   如果类未找到
     */
    @SuppressWarnings("unchecked")
    public static <T extends Serializable> T clone(T obj) throws IOException, ClassNotFoundException {
        if (obj == null) {
            throw new IllegalArgumentException("对象不能为空");
        }

        // 创建字节输出流
        ByteArrayOutputStream byteOutStream = new ByteArrayOutputStream();
        // 创建对象输出流
        ObjectOutputStream outStream = new ObjectOutputStream(byteOutStream);
        // 将对象写入输出流
        outStream.writeObject(obj);
        outStream.flush();

        // 创建字节输入流，基于写入的数据
        ByteArrayInputStream byteInStream = new ByteArrayInputStream(byteOutStream.toByteArray());
        // 创建对象输入流
        ObjectInputStream inStream = new ObjectInputStream(byteInStream);

        // 读取克隆的对象并返回
        return (T) inStream.readObject();
    }
}
